

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Types;

/**
 * 调用存储过程
 * 
 * 第一步：加载驱动  Class.forName("oracle.jdbc.OracleDriver");
 * 第二步：建立连接  DriverManager.getConnection()
 * 第三步：CallableStatement connection.prepareCall()
 * 第四步：
 *   设置入参
 *   注册出参
 * 
 * 第五步：使用 statement.executeUpdate()执行
 * 
 * 第六步：关闭操作
 * 关闭结果集
 * 关闭语句
 * 关闭连接
 */
public class Proc {
	
	public static void main(String[] args) {
		call(1, 2, "");
	}
	
	public static void call(int a, int b, String c) {
		// 1. 加载驱动
		try {
			Class.forName("oracle.jdbc.OracleDriver");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		
		Connection connection = null;
		CallableStatement cs = null;
		try {
			// 2. 建立连接
			connection = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "user1", "111");
			// 3. 获得CallableStatement（预处理语句）并编写sql
			cs = connection.prepareCall("{call proc_bbbb(?,?,?,?)}");
			
			// 4. 赋值入参 in
			cs.setInt(1, a);
			cs.setInt(2, b);
			cs.setString(3, c); // inout
			
			// 5. 注册出参 out
			cs.registerOutParameter(3, Types.VARCHAR); // inout
			cs.registerOutParameter(4, Types.VARCHAR);
			
			// 6. 执行procedure
			cs.executeUpdate();
			
			// 7. 获取出参的值
			System.out.println("c: " + cs.getString(3));
			System.out.println("d: " + cs.getString(4));
			
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			// 5. 关闭连接（资源）
			try {
				if (cs != null) {
					cs.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
			
			try {
				if (connection != null) {
					connection.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}

}
